import axios from 'axios';//这个需要你自己去npm install axios进行安装
/*
 * 注意： 这个地方 不能引入 router，不然前端报错，业务无法渲染
 * [Vue Router warn]: Record with path "/sys" is either missing a "component(s)" or "children" property.
 */
import router from '@/router';
import * as storage  from '@/util/localstorageutil.js';
import {ElMessage} from "element-plus";

const axiosInit = axios.create({//创建一个axios实例
    baseURL: "http://127.0.0.1:8081",//基准URL，就是相同的那一部分
    time: 10000,//响应时间
})

//下面的是请求拦截
axiosInit.interceptors.request.use((config) => {
        //鉴权
        if (storage.getItem(storage.LS_TOKEN)) {
            config.headers[storage.LS_TOKEN] = storage.getItem(storage.LS_TOKEN);
        }
        return config;//通过，返回响应的拦截
    }, (error) => {//出现错误
        console.log('request拦截' + error)
        return Promise.reject(error);//返回错误信息
    }
)

/**
 * 同一个时刻只能有一个 错误提示
 */
var isMessageShowing = false;
function showMessageError(type, message) {
    if(!isMessageShowing){
        isMessageShowing = true;
        ElMessage({
            message: message,
            //warning 、error、success
            type: type,
            onClose: () => {
                isMessageShowing = false;
            }
        });
    }
}

//下面的是响应拦截
axiosInit.interceptors.response.use(
    (response) => {//如果后端返回成功，就执行{}里面的内容
        console.log(response);//打印一下后端返回的数据
        if (response.status === 200) {//判断一下后端返回的数据中的状态码是不是200，如果是200，就执行下面的return
            return Promise.resolve(response);
        } else if (response.status === 403) {
            console.log('response拦截', response)
            return Promise.resolve(response);
        } else {
            //如果返回的状态码不是200，就返回错误的信息，同时也可以在这里定义其他的状态码，然后加上去
            console.log('response拦截', response)
            return Promise.reject(response);
        }
    },
    /*
        1 抛出业务异常
        2 对413 做跳转操作
        3 对非200 异常做提示操作
     */
    (error) => {
        //非200  都走这个方法
        console.log('response拦截' + error)
        if (error.response && error.response.status === 403) {
            console.log('response拦截,并跳转' + error)
            //给错误提示
            showMessageError("error", "auth fali now redirect login now ")
            //跳转到登录页面
            router.push("/login")
        } else {
            console.log(error);
            //其他情况 给错误提示
            showMessageError("error", error)
        }
        return Promise.reject(error);
    }
)

export default axiosInit;//把上面创建的实例暴露出去，方便等等我们在httpHelper.js文件进行引入
